/**
 * Author:yuiop
 * Date:2022/8/19 09:50
 */
package com.devops.common.utils;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;

public class SerializeUtil {
    /**
     * 字节数组转换为字符串
     */
    public static String bytesToString(byte[] bytes) {
        //// 字符串、字节数组转换方式很多，可以根据自己的要求，自定义转换方式
        //转换成hex
        //return org.apache.commons.codec.binary.Hex.encodeHexString(bytes);
        //转换成base64
        return org.apache.commons.codec.binary.Base64.encodeBase64String(bytes);
    }

    /**
     * 字符串转换为字节数组
     * @param str
     * @return
     */
    public static byte[] stringToByte(String str) throws DecoderException {
        //// 字符串、字节数组转换方式很多，可以根据自己的要求，自定义转换方式
        //转换成hex
        //return org.apache.commons.codec.binary.Hex.decodeHex(str);
        //转换成base64
        return org.apache.commons.codec.binary.Base64.decodeBase64(str);
    }

    /**
     * 序列化对象（依赖commons-lang3包）
     * @param obj 序列化对象
     * @return  对象序列化之后的字符串
     */
    public static String serialize(Serializable obj) throws Exception{
        if(obj!=null) {
            byte[] bytes = SerializationUtils.serialize(obj);
            return bytesToString(bytes);
        }
        return null;
    }

    /**
     * 反序列化对象（依赖commons-lang3包）
     * @param str   反序列化字符串
     * @return      反序列化之后的对象
     */
    public static <T extends Serializable> T deserialize(String str) throws Exception{
        if(StringUtils.isNotEmpty(str)){
            return SerializationUtils.deserialize(stringToByte(str));
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
        String str = "\\xAC\\xED\\x00\\x05sr\\x00*org.apache.shiro.session.mgt.SimpleSession\\x9D\\x1C\\xA1\\xB8\\xD5\\x8Cbn\\x03\\x00\\x00xpw\\x02\\x00\\xDBt\\x00$3155d6db-69d3-444f-bce0-bf0cc3266b53sr\\x00\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01\\x82\\xAF\\xA2\\xDFIxsq\\x00~\\x00\\x03w\\x08\\x00\\x00\\x01\\x82\\xB3\\xAA\\x91\\x9Axw\\x13\\x00\\x00\\x00\\x00\\x05&\\\\x00\\x00\\x09127.0.0.1sr\\x00\\x11java.util.HashMap\\x05\\x07\\xDA\\xC1\\xC3\\x16`\\xD1\\x03\\x00\\x02F\\x00\\x0AloadFactorI\\x00\\x09thresholdxp?@\\x00\\x00\\x00\\x00\\x00\\x0Cw\\x08\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x02t\\x00Porg.apache.shiro.subject.support.DefaultSubjectContext_AUTHENTICATED_SESSION_KEYsr\\x00\\x11java.lang.Boolean\\xCD r\\x80\\xD5\\x9C\\xFA\\xEE\\x02\\x00\\x01Z\\x00\\x05valuexp\\x01t\\x00Morg.apache.shiro.subject.support.DefaultSubjectContext_PRINCIPALS_SESSION_KEYsr\\x002org.apache.shiro.subject.SimplePrincipalCollection\\xA8\\x7FX%\\xC6\\xA3\\x08J\\x03\\x00\\x01L\\x00\\x0FrealmPrincipalst\\x00\\x0FLjava/util/Map;xpsr\\x00\\x17java.util.LinkedHashMap4\\xC0N\\\\x10l\\xC0\\xFB\\x02\\x00\\x01Z\\x00\\x0BaccessOrderxq\\x00~\\x00\\x06?@\\x00\\x00\\x00\\x00\\x00\\x0Cw\\x08\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x01t\\x00*com.devops.shiro.config.ShiroServerRealm_0sr\\x00\\x17java.util.LinkedHashSet\\xD8l\\xD7Z\\x95\\xDD*\\x1E\\x02\\x00\\x00xr\\x00\\x11java.util.HashSet\\xBAD\\x85\\x95\\x96\\xB8\\xB74\\x03\\x00\\x00xpw\\x0C\\x00\\x00\\x00\\x02?@\\x00\\x00\\x00\\x00\\x00\\x01sr\\x00\\x1Ecom.devops.shiro.vm.BaseUserVMr\\x9D\\x8E^H\\xEB\\x1C)\\x02\\x00\\x15L\\x00\\x0BaccessTokent\\x00\\x12Ljava/lang/String;L\\x00\\x09adminRolet\\x00\\x13Ljava/lang/Boolean;L\\x00\\x09creatDatet\\x00\\x10Ljava/util/Date;L\\x00\\x09creatUserq\\x00~\\x00\\x16L\\x00\\x05emailq\\x00~\\x00\\x16L\\x00\\x02idq\\x00~\\x00\\x16L\\x00\\x07imageIdq\\x00~\\x00\\x16L\\x00\\x09loginNameq\\x00~\\x00\\x16L\\x00\\x08nickNameq\\x00~\\x00\\x16L\\x00\\x08passwordq\\x00~\\x00\\x16L\\x00\\x0BphoneNumberq\\x00~\\x00\\x16L\\x00\\x08realNameq\\x00~\\x00\\x16L\\x00\\x06roleIdt\\x00\\x13Ljava/lang/Integer;L\\x00\\x09roleLevelq\\x00~\\x00\\x19L\\x00\\x08roleNameq\\x00~\\x00\\x16L\\x00\\x09signatureq\\x00~\\x00\\x16L\\x00\\x06statusq\\x00~\\x00\\x19L\\x00\\x08supermanq\\x00~\\x00\\x17L\\x00\\x0AupdateDateq\\x00~\\x00\\x18L\\x00\\x0AupdateUserq\\x00~\\x00\\x16L\\x00\\x08userTypeq\\x00~\\x00\\x19xppsq\\x00~\\x00\\x09\\x00pt\\x00\\x03123pt\\x00 b9c1073c7238425e92e2248303b032e7pt\\x00\\x06heyabot\\x00\\x04yydst\\x00 1f779a65ed4f8f886f33143d18209229pt\\x00\\x06heyabosr\\x00\\x11java.lang.Integer\\x12\\xE2\\xA0\\xA4\\xF7\\x81\\x878\\x02\\x00\\x01I\\x00\\x05valuexr\\x00\\x10java.lang.Number\\x86\\xAC\\x95\\x1D\\x0B\\x94\\xE0\\x8B\\x02\\x00\\x00xp\\x00\\x00\\x00\\x03q\\x00~\\x00$t\\x00\\x0C\\xE6\\x8A\\x80\\xE6\\x9C\\xAF\\xE7\\xBB\\x8F\\xE7\\x90\\x86psq\\x00~\\x00\"\\x00\\x00\\x00\\x01q\\x00~\\x00\\x1Bpt\\x00\\x03123sq\\x00~\\x00\"\\x00\\x00\\x00\\x02xx\\x00w\\x01\\x01q\\x00~\\x00\\x10xxx";
        Object o = deserialize(str);
        System.out.println(o.toString());
    }
}
